/*********************************************************
This class is another class derived from TypeANCU which has
one sequence of composite vents and an intermediate vent.  The ID of this class is "C".  The
class maintains the method that depends its own configuraton
to calculate its output.
*********************************************************/
#pragma once
#include <algorithm>
#include "TypeANCU.h"
#include "Misc.h"
#include "NCUGenomeSet.h"
#ifndef _TypeCNCU
#define _TypeCNCU
class TypeCNCU: virtual public TypeANCU
{
public:
	// constructors
	TypeCNCU();
	TypeCNCU(const unsigned int &config);
	TypeCNCU(const unsigned int &config, const vector<double> &paras);
	TypeCNCU(const TypeCNCU &rhs);
	// destructor
	virtual ~TypeCNCU();
	// operator assignment
	TypeCNCU& operator=(const TypeCNCU &rhs);
	/*********************************************
	Configuration Section
	*********************************************/
	// get the number of parameters of a NCU
	virtual const unsigned int number() const;
	/*********************************************
	Parameters Section
	*********************************************/
	// assign all parametrs of a NCU
	virtual bool parameters(const vector<double> &paras);
	// get all parameters of a NCU
	virtual vector< double> parameters() const;
	// virtual constructor
	virtual GeneralNCU* clone() const;
	// simulation and update the current sill
	virtual outputPair simulation(const double &input);
	// get the genome informatoin
	virtual vector<const GenomeType*> genome() const;
protected:
	// calculate the output of the longitudinal outputs
	virtual double bottom(const double &sill);
protected:
	SingleVent m_interVent; // intermediate single vent
};
#endif